package com.gitee.l0km.beanfilter.annotations;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import com.gitee.l0km.beanfilter.core.CodecPhase;
import com.gitee.l0km.beanfilter.core.CodecScope;

/**
 * 过滤器关联类型定义元注解<br>
 * 当输入参数或返回类型中有类型变量(TypeVariable)，
 * 且beanfilter无法自动匹配到其实际对应的类型时(如 {@code List<T>} )，
 * 即该类型可能是任意种类型，此注解用于手动定义该类型实际可能匹配的类型，以确保字段过滤能有效执行
 * @author guyadong
 *
 */
@Retention(RUNTIME)
@Target({ElementType.ANNOTATION_TYPE} )
public @interface AssociatedType {
	/**
	 * 关联类型
	 */
	Class<?>[] associatedTypes() default {};
	/**
	 * 关联类名，与{@link #associatedTypes()}作用相同，
	 * 以字符串形式提供类型，在有些场景可以减少模组耦合
	 */
	String[] associatedTypeNames() default {};

	/**
	 * 关联类型适用编码解码阶段
	 */
	CodecPhase phase();
	/**
	 * 关联类型适用的编解码(序列化/反序列化)目标范围
	 */
	CodecScope scope() default CodecScope.ALL;
}
